[C] Listas Duplamente Encadeadas
Publicado por Enzo de Brito Ferber 09/04/2006
[ Hits: 9.532 ]
Homepage: http://www.maximasonorizacao.com.br
Codigo de fácil entendimento com funçoes de inserçao em ordem crescente, retirada, e outras :).... Muito bom
/*
* Programa: Listas Duplamente Encadeadas
* Arquivo : lde.c
* Autor : Enzo Ferber 'Slackware_10'
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MALLOC(a) (a*)malloc(sizeof(a))
struct node{
int info;
struct node *next;
struct node *prior;
};
struct node *head;
struct node *last;
void display(void);
void menu(void);
void push(int);
void pop(int);
void ins(void);
void del(void);
void clear(void);
void flush(void);
int length(void);
void push(int valor){
struct node *novo;
struct node *current;
current = head;
novo = MALLOC(struct node);
if(!head){
novo->info = valor;
novo->next = NULL;
novo->prior = NULL;
head = last = novo;
}
if(valor > last->info){
novo->info = valor;
novo->next = NULL;
novo->prior = last;
last->next = novo;
last = novo;
return;
}
if(valor < head->info){
novo->info = valor;
novo->next = head;
novo->prior = NULL;
head->prior = novo;
head = novo;
return;
}
while(current){
if(current->info > valor){
novo->info = valor;
novo->next = current;
novo->prior = current->prior;
current->prior->next = novo;
current->prior = novo;
}
current = current->next;
}
}
void pop(int valor){
struct node *current;
current = head;
if(valor == head->info){
head = head->next;
free(head->prior);
return;
}
if(valor == last->info){
last = last->prior;
free(last->next);
return;
}
while(current){
if(current->info == valor){
current->prior->next = current->next;
current->next->prior = current->prior;
free(current);
return;
}
current = current->next;
}
}
void display(void){
struct node *aux;
aux = head;
if(!head){
clear();
printf("Pilha vazia.");
getchar();
getchar();
return;
}
clear();
while(aux){
printf("%d\n", aux->info);
aux = aux->next;
}
getchar();
getchar();
}
void ins(void){
int valor;
clear();
printf("Valor: ");
flush();
scanf("%d", &valor);
push(valor);
}
void del(void){
int valor;
clear();
printf("Valor: ");
flush();
scanf("%d", &valor);
pop(valor);
}
void flush(void){
fflush(stdin);
}
void clear(void){
system("cls");
}
void menu(void){
int op;
while(1){
clear(); //limpa a tela
printf("\n\tLitas duplamente encadeadas\n\n");
printf("\t1. Inserir\n");
printf("\t2. Retirar\n");
printf("\t3. Mostar\n");
printf("\t4. Sair\n\n");
printf("\tSua opcao: ");
flush(); //limpa o buffer de entrada do teclado
scanf("%d", &op); //le de 'stdin' um valor inteiro e armazena em 'op'
switch(op){ //faz um 'switch' com o valor de op
case 1:
ins();
break;
case 2:
del();
break;
case 3:
display();
break;
case 4:
free(head);
free(last);
exit(0);
default:
clear();
printf("Opcao invalida");
getchar();
}
}
}
int main(void){
head = last = NULL;
menu();
return 0;
}
Cálculo de logaritmo de um número por Série de Taylor em C
Jogo da Velha com IA invencivel
Gentoo: detectando impressoras de rede e como fixar uma impressora por IP
Como o GNOME conseguiu o feito de ser preterido por outras interfaces gráficas
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
Instalar Linux em notebook Sony Vaio VPCEG13EB (10)
Vou destruir sua infância:) (6)
Quando vocês pararam de testar distros? (24)









